package com.xbongbong.saas.model;

import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.IModel;
import com.xbongbong.saas.domain.entity.BusinessProductEntity;
import com.xbongbong.saas.domain.entity.ContractProductEntity;

import java.util.List;
import java.util.Map;

/**
 * @author long.rao
 * @version v1.0
 * @date 2019/2/23 15:32
 * @since v1.0
 */
public interface ContractProductModel extends IModel<ContractProductEntity> {
    /**
     * 数据插入
     * @param entity
     * @throws XbbException 异常
     * @return Integer
     * @author long.rao
     * @date 2019-02-01 15:16
     */
    @Override
    Integer insert(ContractProductEntity entity) throws XbbException;

    /**
     * 批量添加
     * @param insertList
     * @return
     * @throws XbbException
     */
    Integer insertBatch(List<ContractProductEntity> insertList) throws XbbException;
    /**
     * 数据更新
     * @param entity
     * @throws XbbException 异常
     * @return Integer
     * @author long.rao
     * @date 2019-02-01 15:17
     */
    @Override
    Integer update(ContractProductEntity entity) throws XbbException;
    /**
     * 查询多个
     * @param param 参数
     * @return List<ContractProductEntity>
     * @author long.rao
     * @date 2019-02-01 15:18
     */
    @Override
    List<ContractProductEntity> findEntitys(Map<String, Object> param);

    List<ContractProductEntity> getSortProducts(Map<String, Object> param);

    /**
     * 多条查询
     * @param param 参数
     * @return java.lang.Integer
     * @author long.rao
     * @date 2019-02-01 15:18
     */
    @Override
    Integer getEntitysCount(Map<String, Object> param);
    /**
     * 单条查询
     * @param key 主键ID
     * @param corpid 公司ID
     * @return java.lang.Integer
     * @author long.rao
     * @date 2019-02-01 15:19
     */
    ContractProductEntity getByKey(Long key, String corpid);

    /**
     * 根据合同id获取对应的类型的产品
     * @param conId 合同id
     * @param corpid 公司ID
     * @author long.rao
     * @date 2019-03-02 16:20
     */
    List<ContractProductEntity> getProductsByConId(Long conId, String corpid);
    /**
     * 根据合同id获取对应的类型的产品
     * @param conId 合同id
     * @param corpid 公司ID
     * @param del
     * @author long.rao
     * @date 2019-03-02 16:20
     */
    List<ContractProductEntity> getProductsByConId(Long conId, String corpid, List<Integer> del);

    /**
     * 获取缺货产品合同
     * 原saas方法连表层级太深，拆了
     * @param corpid 公司id
     * @param isProduce 1：待生产列表；0：待采购列表，默认0
     * @return
     */
    @Deprecated
    List<ContractProductEntity> getAllContractProduct(String corpid, Integer isProduce);

    /**
     * 获取缺货产品合同根据合同id
     * 原saas方法连表层级太深，拆了
     * @param corpid 公司id
     * @param isProduce 1：待生产列表；0：待采购列表，默认0
     * @return
     */
    List<ContractProductEntity> getContractProductByContractIdIn(String corpid, Integer isProduce, List<Long> contractIdIn);

    /**
     * 获取产品合同根据合同id
     * @param corpid 公司id
     * @param contractIdIn 合同id
     * @return 数据
     */
    List<ContractProductEntity> getContractProductByContractIdIn(String corpid, List<Long> contractIdIn);

    /**
     * 获取缺货产品合同根据合同id
     * 原saas方法连表层级太深，拆了
     * @param corpid 公司id
     * @param isProduce 1：待生产列表；0：待采购列表，默认0
     * @return
     */
    List<ContractProductEntity> getContractProductByProductIdIn(String corpid, Integer isProduce, List<Long> productIdIn);

    /**
     * 报表中心产品销售汇总表（获取实体并求出产品总数量、产品总销售金额、产品总成本）
     *
     * @param param productIdIn,page,corpid,del,contractIdIn,pageNum,start,orderByStr(sum_product_num desc, sum_price desc)
     * @return java.util.List<com.xbongbong.saas.domain.entity.ContractProductEntity>
     * @author 徐俊杰
     * @date 2019/3/5 17:29
     * @since v1.0
     */
    List<ContractProductEntity> findEntitysForTarget(Map<String, Object> param);

    /**
     * 报表中心产品销售汇总表（总量）
     *
     * @param param productIdIn,page,corpid,del,contractIdIn,pageNum,start,orderByStr(sum_product_num desc, sum_price desc)
     * @return java.lang.Integer
     * @author 徐俊杰
     * @date 2019/3/5 19:30
     * @since v1.0
     */
    Integer getEntitysCountForTarget(Map<String, Object> param);

    /**
     * 批量删除合同产品
     * @author 吴峰
     * @date 2019/3/13 17:10
     * @param contractIdIn  合同id
     * @param corpid 公司id
     * @return java.lang.Integer
     * @throws XbbException 业务异常
     */
    Integer deleteContractAllProduct(List<Long> contractIdIn, String corpid, Integer del) throws XbbException;

    Integer updateBatch(List<ContractProductEntity> updateList, String corpid) throws XbbException;

    /**
     * 批量编辑
     * @param updateList
     * @param corpid
     * @return
     * @throws XbbException
     */
    Integer updateMulti(List<ContractProductEntity> updateList, String corpid) throws XbbException;

    Integer updateBatchImmediately(List<ContractProductEntity> updateList, String corpid) throws XbbException;

    Integer updateOutStock(List<ContractProductEntity> updateList, String corpid) throws XbbException;

    List<BusinessProductEntity> findProductNum(Map<String,Object> param);

    Integer findProductNumCount(Map<String,Object> param);

    List<BusinessProductEntity> findProductNumIncludeProcess(Map<String,Object> param);

    Integer findProductNumCountIncludeProcess(Map<String,Object> param);

    /**
     *
     * @param contractProductList
     * @throws XbbException
     */
    void reductionEsInUpdate(List<ContractProductEntity> contractProductList) throws XbbException;

    List<ContractProductEntity> getContractCost(Long contractId, String corpid);

    /**
     * 查询data中有没有该字段的数据
     * @param attr
     * @param formId
     * @return
     */
    Long isProductSubAttrExist(String attr, String corpid, Integer type, Long formId, Integer isArray);

    Long countProductSub(String attr, String corpid, Integer type, Long formId, Integer isArray);

    void updateInStock(List<ContractProductEntity> updateList, String corpid);

    void updateInStockForJob(List<ContractProductEntity> updateList, String corpid);

    void updateOutStockForJob(List<ContractProductEntity> updateList, String corpid);

    Double summaryByAttr(String field,String corpid,  Long refId, List<Long> productIdIn,Integer type);

    Double summaryByAttrFromOutSide(String field, String corpid, Long refId, List<Long> productIdIn,Integer type);

    /**
     * 根据主键删除记录
     *
     * @param key    主键
     * @param corpid 公司id
     * @return java.lang.Integer
     * @author youli.chen
     * @date 2019/2/21 15:18
     */
    Integer deleteByKey(Long key, String corpid);

    Double calcuateByAttrFromOutSide(String field1, String field2, String corpid, Long refId, List<Long> productIdIn, Integer type);

    /**
     * 根据产品ID集合和公司ID修改是否生产标记
     *
     * @param isProduce     是否生产标记 1：待生产列表；0：待采购列表，默认0
     * @param corpid        公司ID
     * @param productIdList 产品ID集合
     * @return 影响行数
     */
    Integer updateIsProduceByProductId(Integer isProduce, String corpid, List<Long> productIdList) throws XbbException ;

    List<ContractProductEntity> getProductWithSubData(String attr, String corpid, Integer type, Long formId, Integer isArray, Long idGte, Integer limit);

    /**
     * 更新发货数量
     * @param updateList
     * @param corpid
     * @return
     * @throws XbbException
     */
    Integer updateShipNum(List<ContractProductEntity> updateList, String corpid) throws XbbException;

    /**
     * 获取待出库产品列表
     * @param param
     * @return
     * @throws XbbException
     */
    List<ContractProductEntity>  findWaitOutProductEntitys(Map<String, Object> param) throws XbbException;

    /**
     * 获取待采购产品列表
     * @param param
     * @return
     * @throws XbbException
     */
    List<ContractProductEntity>  findWaitPurchaseProductEntitys(Map<String, Object> param) throws XbbException;

    /**
     * 获取待采购产品总数
     * @param param
     * @return
     * @throws XbbException
     */
    Integer  findWaitPurchaseProductCount(Map<String, Object> param) throws XbbException;

    /**
     * 根据产品ID,公司ID获取待出库的产品信息（主要获取产品对应待出库数量）
     * @param param
     * @throws XbbException
     */
    List<ContractProductEntity> getWaitOutstockProductByProductIdIn(Map<String, Object> param);

    /**
     * 批量删除
     * @param list
     * @param corpid
     * @return
     * @throws XbbException
     */
    Integer deleteByIdIn(List<ContractProductEntity> list, String corpid) throws XbbException;
    /**
     * 批量更新删除标识
     * @param list
     * @param corpid
     * @param del
     * @return
     * @throws XbbException
     */
    Integer deleteBatch(List<ContractProductEntity> list, String corpid, Integer del) throws XbbException;

    /**
     * 根据id获取合同产品列表
     * @param contractProductIdList
     * @param corpid
     * @return
     * @throws XbbException
     */
    List<ContractProductEntity> getById(List<Long> contractProductIdList, String corpid) throws XbbException;

    List<ContractProductEntity> getInstockProductAndContractProdcut(Map<Long , Long> stockFlowAndContractProduct , String corpid);

    void updateInstockProductById(List<ContractProductEntity> contractProductEntityList, String corpid);

    /**
     * 根据公司ID，合同ID批量更新产品关联表待出库状态
     *
     */
    void updateWaitOutStatusById(List<Long> contractIdIn, String corpid, Integer status, Integer type) throws XbbException;

    Integer findWaitOutStockProductCount(Map<String, Object> param);

    /**
     * 谨慎调用，里面会有大批量的更新，最多可达到12w数据量
     * 产品名称更改时，同步时合同产品中的产品信息
     * @param corpid 公司id
     * @param parentId
     * @param productName
     * @param productNo
     * @param specification
     * @return
     * @throws XbbException
     */
    Integer updateProductInfoByParentId(String corpid, Long parentId, String productName, String productNo, String specification )  throws XbbException;
}
